/**
 * UFCG - CEEI - DSC- SI1
 * Projeto da Disciplina Sistema de Informacao 1 - 2011.1
 * 
 * Professor: Hyggo Almeida
 * 
 * Alunos: Felipe de Sousa - felipeso@lcc.ufcg.edu.br
 * 		   Matheus Sampaio - matheusss@lcc.ufcg.edu.br
 *         Henrique Florencio - henriquecf@lcc.ufcg.edu.br
 *         Claudio Cardoso - claudiocaj@lcc.ufcg.edu.br
 * 		   Julio Henrrique - juliohr@lcc.ufcg.edu.br
 * 
 */

package model;

import java.io.Serializable;

import exception.ExceptionAtributoInexistenteEvento;
import exception.ExceptionDataInvalida;
import exception.ExceptionDataInvalidaFinalDeSemana;
import exception.ExceptionIdentificacaoInvalida;

public class Evento implements Serializable {

	private static final long serialVersionUID = -7667920515706658194L;
	private String area;
	private String contato;
	private String fim;
	private String id;
	private String inicio;
	private Data data;
	private String nome;
	private int repeticoes;

	/**
	 * Evento sem repeticao
	 * 
	 * @param id
	 *            uma string que represente o id do evento
	 * @param nome
	 *            uma string que represente o nome do evento
	 * @param inicio
	 *            uma string em forma de data que represente o inicio do evento
	 * @param fim
	 *            uma string em forma de data que representa o fim do evento
	 * @param area
	 *            uma string que representa em qual area o evento estar alocado
	 * @param contato
	 *            uma string que represente o nome do contato do evento
	 * @throws ExceptionDataInvalidaFinalDeSemana
	 *             caso o evento seja alocado no fim de semana
	 * @throws ExceptionDataInvalida
	 *             caso a data passada esteja em formato invalido
	 * @throws ExceptionIdentificacaoInvalida
	 *             caso o id do evento nao seja passado como parametro
	 */
	public Evento(String id, String nome, String inicio, String fim,
			String area, String contato) throws ExceptionDataInvalida,
			ExceptionDataInvalidaFinalDeSemana, ExceptionIdentificacaoInvalida {
		this(id, nome, inicio, fim, area, 0, contato);
	}

	/**
	 * Evento com repeticao
	 * 
	 * @param id
	 *            uma string que represente o id do evento
	 * @param nome
	 *            uma string que represente o nome do evento
	 * @param inicio
	 *            uma string em forma de data que represente o inicio do evento
	 * @param fim
	 *            uma string em forma de data que representa o fim do evento
	 * @param area
	 *            uma string que representa em qual area o evento estar alocado
	 * @param repeticoes
	 *            um inteiro que representa o numero de repeticoes do evento
	 * @param contato
	 *            uma string que represente o nome do contato do evento
	 * @throws ExceptionDataInvalidaFinalDeSemana
	 *             caso o evento seja alocado no fim de semana
	 * @throws ExceptionDataInvalida
	 *             caso a data passada esteja em formato invalido
	 * @throws ExceptionIdentificacaoInvalida
	 *             caso o id do evento nao seja passado como parametro
	 */
	public Evento(String id, String nome, String inicio, String fim,
			String area, int repeticoes, String contato)
			throws ExceptionDataInvalida, ExceptionDataInvalidaFinalDeSemana,
			ExceptionIdentificacaoInvalida {
		setId(id);
		setNome(nome);
		setInicio(inicio);
		setFim(fim);
		setArea(area);
		setContato(contato);
		setRepeticoes(repeticoes);
		setData(new Data(inicio, fim));
	}

	public void setData(Data data) {
		this.data = data;
	}

	/**
	 * Metodo que verifica se a cada inicial, cai exatamente em um fim de semana
	 * 
	 * @return boolean - caso a primeira data esteja no fim de semana, false,
	 *         caso contr�rio;
	 */
	public boolean caiFimDeSemana() {
		return getData().ehFimDeSemana();
	}

	/**
	 * Metodo que retorna a area do evento
	 * 
	 */
	public String getArea() {
		return area;
	}

	/**
	 * Metodo que retorna o valor do atributo do evento
	 * 
	 * @param atributo
	 *            - atributo que se deseja saber o valor;
	 * @return String - valor do campo do atributo
	 * @throws ExceptionAtributoInexistenteEvento
	 *             - lan�ado caso atributo nao exista;
	 */
	public String getAtributos(String atributo)
			throws ExceptionAtributoInexistenteEvento {
		if (atributo.equals("nome"))
			return getNome();
		else if (atributo.equals("inicio"))
			return getInicio();
		else if (atributo.equals("fim"))
			return getFim();
		else if (atributo.equals("area"))
			return getArea();
		else if (atributo.equals("repeticoes"))
			return "" + getRepeticoes();
		else if (atributo.equals("contato"))
			return getContato();
		else
			throw new ExceptionAtributoInexistenteEvento();
	}

	/**
	 * Metodo que retorna o contato da sala
	 * 
	 * @return uma string representando o contato da sala
	 */
	public String getContato() {
		return contato;
	}

	/**
	 * Metodo que retorna a data do evento com numero de repeti��es
	 * 
	 * @return um objeto do tipo Data
	 */
	public Data getData() {
		return data;
	}

	/**
	 * Metodo que retorna em que horario encerra o evento
	 * 
	 * @return uma string em formato de hora que representa o horario de fim do
	 *         evento
	 */
	public String getFim() {
		return fim;
	}

	/**
	 * Metodo que retorna o id do Evento
	 * 
	 * @return String - id do evento;
	 */
	public String getId() {
		return id;
	}

	public String getInicio() {
		return inicio;
	}

	/**
	 * Metodo que retorna o nome do Eventp
	 * 
	 * @return String - nome do evento;
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * Metodo que retorna a quantidade de repeticoes do evento
	 * 
	 * @return um inteiro que representa o numero de repeticoes
	 */
	public int getRepeticoes() {
		return repeticoes;
	}

	/**
	 * Metodo que modifica a area do evento
	 * 
	 * @param area
	 *            a nova area do evento
	 */
	public void setArea(String area) {
		this.area = area;
	}

	/**
	 * metodo usando para modificar o contato do evento
	 * 
	 * @param contato
	 *            uma string representando o novo contato do evento
	 */
	public void setContato(String contato) {
		this.contato = contato;
	}

	/**
	 * Metodo que modifica o fim do evento
	 * 
	 * @param fim
	 *            uma string em formato de hora que modifica o fim do evento
	 */
	public void setFim(String fim) {
		this.fim = fim;
	}

	/**
	 * Metodo que seta o id do Evento
	 * 
	 * @param id
	 *            - novo id do evento
	 * @throws ExceptionIdentificacaoInvalida
	 *             - lan�ado quando a identifica��o � invalida;
	 */
	public void setId(String id) throws ExceptionIdentificacaoInvalida {
		if (id.equals("") || id == null)
			throw new ExceptionIdentificacaoInvalida();
		this.id = id;
	}

	/**
	 * Metodo que modifica o inicio do evento
	 * 
	 * @param inicio
	 *            uma string em formato de data para modificar o inicio do
	 *            evento
	 */
	public void setInicio(String inicio) {
		this.inicio = inicio;
	}

	/**
	 * Metodo que modifica o nome do evento
	 * 
	 * @param nome
	 *            uma string para representar o nome do evento
	 */
	public void setNome(String nome) {
		this.nome = nome;
	}

	/**
	 * Metodo que modifica o numero de repeticoes do evento
	 * 
	 * @param repeticoes
	 *            um inteiro que representa o numero de repeticoes do evento
	 */
	public void setRepeticoes(int repeticoes) {
		this.repeticoes = repeticoes;
	}

	/**
	 * Metodo privado que se é delegado a verificação de um choque de horario
	 * entre dois eventos
	 * 
	 * @param primeiroEvento
	 *            - evento
	 * @param segundoEvento
	 *            - evento
	 * @return boolean - true, caso de choque de horario entre esses dois
	 *         eventos, false, caso contrário;
	 */
	public static boolean procuraPorChoqueHorario(Evento primeiroEvento,
			Evento segundoEvento) {
		Data dataAtual = primeiroEvento.getData();
		Data segundaData = segundoEvento.getData();
		return dataAtual.choqueHorario(segundaData,
				primeiroEvento.getRepeticoes())
				|| segundaData.choqueHorario(dataAtual,
						segundoEvento.getRepeticoes());

	}

}
